package com.dz.risk.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.dz.risk.common.ResponseVO;
import com.dz.risk.common.enums.ReportFormsTypeEnum;
import com.dz.risk.pojo.domain.ReportFormsEntity;
import com.dz.risk.pojo.model.CommonPageResult;
import com.dz.risk.pojo.model.PageModel;

import java.util.Date;
import java.util.List;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeoutException;

/**
 * 报表目录
 *
 * @author baohan
 * @email
 * @date 2021-07-05 14:49:45
 */
public interface ReportFormsService extends IService<ReportFormsEntity> {

    /**
     * 根据报表名称以及版本号查询报表基本信息
     *
     * @param reportFormsSerialNumber 报表编号
     * @param beginDate               开始时间
     * @param endDate                 结束时间
     * @return 报表基本信息
     */
    List<ReportFormsEntity> selectByReportFormsNameAndVersion(String reportFormsSerialNumber, Date beginDate, Date endDate);

    /**
     * 根据报表编号查询报表基本信息集合
     *
     * @param reportFormsSerialNumber 报表编号
     * @return 报表基本信息集合
     */
    List<ReportFormsEntity> selectByReportFormsSerialNumber(String reportFormsSerialNumber);

    /**
     * 根据参数查询报表结构树
     *
     * @param pageModel               分页模型
     * @param reportFormsName         报表名称
     * @param reportFormsSerialNumber 报表编号
     * @return 报表结构树模型集合
     */
    CommonPageResult selectReportFormsTreeByParams(PageModel pageModel, String reportFormsName, String reportFormsSerialNumber);

    /**
     * 查询所有报表基本信息(无版本得原始报表信息)
     *
     * @param reportFormsSerialNumber 报表编号
     * @param reportFormsName         报表名称
     * @return 报表基础信息集合
     */
    List<ReportFormsEntity> selectBasicInformationByParams(String reportFormsSerialNumber, String reportFormsName);

    /**
     * 根据报表编号删除报表基本信息以及下属报表
     *
     * @param reportFormsSerialNumber 报表编号
     */
    void deleteByReportFormsSerialNumber(String reportFormsSerialNumber);

    /**
     * 查询所有报表基本信息(已导入版本得报表数据)
     *
     * @param pageModel               分页模型
     * @param reportFormsSerialNumber 报表编号
     * @param reportFormsName         报表名称
     * @param reportFormsBeginDate    报表开始时间
     * @param reportFormsEndDate      报表结束时间
     * @return 报表基础信息集合
     */
    CommonPageResult selectVersionReportFormsByParams(PageModel pageModel, String reportFormsSerialNumber, String reportFormsName, Date reportFormsBeginDate, Date reportFormsEndDate);

    ResponseVO update(ReportFormsEntity reportFormsEntity);

    /**
     * 根据单元格编号以及版本区间获取该区间版本的该单元格所属的报表基本信息
     *
     * @param cellSerialNumber 单元格编号
     * @param versionBeginDate 版本开始时间
     * @param versionEndDate   版本结束时间
     * @return 报表基本信息
     */
    List<ReportFormsEntity> selectByCellSerialNumberAndBeginDateAndEndDate(String cellSerialNumber, Date versionBeginDate, Date versionEndDate);

    /**
     * 查询报表版本开始结束时间等于参数开始结束时间的报表信息集合
     *
     * @param beginDate       开始时间
     * @param endDate         结束时间
     * @param reportType      报表类型
     * @param reportFormsName 报表名称
     * @return 报表基本信息集合
     */
    List<ReportFormsEntity> selectReportFormsByBeginDateAndEndDate(Date beginDate, Date endDate, ReportFormsTypeEnum reportType, String reportFormsName);

    /**
     * 根据旧报表模板ID生成新版本报表模板
     *
     * @param reportFormsEntity 报表基本信息
     */
    void generateNewVersionReportFormsByReportFormsId(ReportFormsEntity reportFormsEntity);

    /**
     * 模板模板数据计算
     *
     * @param calculatingTime 计算时间
     * @param reportFormsIds  模板ID集合
     * @throws InterruptedException
     * @throws BrokenBarrierException
     * @throws TimeoutException
     * @throws ExecutionException
     */
    void reportFormsTemplateDataCalculate(Date calculatingTime, List<String> reportFormsIds) throws InterruptedException, BrokenBarrierException, TimeoutException, ExecutionException;

    List<ReportFormsEntity> selectByNameOrNumber(ReportFormsEntity reportFormsEntity);

    ResponseVO queryOnly(ReportFormsEntity reportFormsEntity);

    /**
     * 根据版本批量计算报表
     *
     * @param beginDate       开始时间
     * @param endDate         结束时间
     * @param calculatingTime 计算版本
     */
    void reportFormsCalculateBatchByVersion(Date beginDate, Date endDate, Date calculatingTime) throws InterruptedException, BrokenBarrierException, TimeoutException, ExecutionException;
}

